package com.kamistoat.ruoyi.ruoyicommoncore.utils.file;

import com.kamistoat.ruoyi.ruoyicommoncore.utils.StringUtils;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.Objects;

/**
 * 文件类型工具类，静态方法直接使用元类调用。
 */
public class FileTypeUtils {

    /**
     * 根据文件句柄返回文件类型(即扩展名)，直接截取.之后的内容，不含.
     *
     * @param file
     * @return
     */
    public static String getFileType(File file) {
        if (file == null) {
            return StringUtils.EMPTY;
        } else {
            return getFileType(file.getName());
        }
    }

    /**
     * 根据文件句柄返回文件类型(即扩展名)，直接截取.之后的内容，不含.
     *
     * @param name
     * @return
     */
    public static String getFileType(String name) {
        int lastIndexOf = name.lastIndexOf(".");
        if (lastIndexOf < 0) {
            // 说明文件名中根本没有 .
            return StringUtils.EMPTY;
        } else {
            // 否则截取并小写
            return name.substring(lastIndexOf + 1).toLowerCase();
        }
    }

    /**
     * 从 SpringBoot-web的MultipartFile类中获取文件类型(即后缀名)
     *
     * @param file
     * @return
     */
    public static String getExtension(MultipartFile file) {
        // TODO MultipartFile由前端传递给后端，然后再由后端决定怎么保存，是一种本地持久化实现方式。而之前使用的阿里OSS允许前端直连OSS服务器，文件不经过后端本地。
        // 使用 MultipartFile.getOriginalFilename() 获得文件名+扩展名
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
        if (StringUtils.isEmpty(extension)) {
            // 当库方法无法直接根据文件名称确定文件扩展名时，调用重载的getExtension()方法根据文件内容来决定文件扩展名
            extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));
        }
        return extension;
    }

    /**
     * 图片将会以字节码形式上传，从字节码中获取图片的扩展名
     *
     * @param photoByte
     * @return
     */
    public static String getFileExtendName(byte[] photoByte) {
        String strFileExtendName = "JPG";
        // 以下均为编码规则的知识，此处暂不深究
        if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
                && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) {
            strFileExtendName = "GIF";
        } else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) {
            strFileExtendName = "JPG";
        } else if ((photoByte[0] == 66) && (photoByte[1] == 77)) {
            strFileExtendName = "BMP";
        } else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) {
            strFileExtendName = "PNG";
        }
        return strFileExtendName;
    }

}
